package persistencia;

import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;

import logica.locacao.Extrato;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;


/**
 * Baseado na classe Extrato essa classe gera um arquivo pdf com todas as informacoes do extrato do cliente.
 * @author Equipe Localisa, Usa Quem Precisa
 *
 */
public class GeradorDeExtrato {

	private Extrato extrato;
	private Document documento;
	private FileOutputStream fileOutputStream;
	private String nomeAtual;
	
	/**
	 * Construtor que recebe o objeto Extrato gerando o arquivo pdf que sera nomeado com o codigo do extrato,
	 * onde todos irao para o diretorio extratos.
	 * @param Extrato - extrato
	 * @throws IOException
	 */
	public GeradorDeExtrato(Extrato extrato) throws Exception{
		
		if(extrato != null){
			this.extrato = extrato;
		}
		documento = new Document(PageSize.A4);
		nomeAtual = "extratos/"+"ExtratoDeLocacao-Cod."+extrato.getCodigoDoExtrato()+".pdf";
		fileOutputStream = new FileOutputStream(nomeAtual);
		
	}//Fim do construtor
	
	/**
	 * Metodo unico que gera o pdf em si.
	 * @throws IOException
	 */
	public void gerar() throws IOException{
		
		try{
			
			PdfWriter.getInstance(documento, fileOutputStream);
			
			documento.open();
			
			//Coloca a logo da localisa no centro e no comeco do documento
			Image img = Image.getInstance("imagens/logo.gif");
			img.setAlignment(Element.ALIGN_CENTER);
			documento.add(img);
			Font f = new Font(2, 16, Font.BOLD);
			
			//Coloca o codigo da locacao
			documento.add(new Paragraph("Codigo da locacao: "+extrato.getCodigoDoExtrato(), f));
			
			//Tabela com valores e informacoes
			PdfPTable tabela = new PdfPTable(2);
			
			Paragraph cabecalho = new Paragraph("Informacoes", f);
								
			cabecalho.setAlignment(Paragraph.ALIGN_CENTER);
			PdfPCell  titulo = new PdfPCell(cabecalho);
			titulo.setColspan(2);
			tabela.addCell(titulo);
			tabela.addCell("Codigo do cliente");
			tabela.addCell(extrato.getCodigoDoCliente());
			tabela.addCell("Codigo da locacao");
			tabela.addCell(String.valueOf(extrato.getCodigoDoRegistroDeLocacao()));
			tabela.addCell("Data da locacao");
			tabela.addCell(extrato.getDataDeLocacao().toString());
			tabela.addCell("Data prevista de devolucao");
			tabela.addCell(extrato.getDataDeDevolucao().toString());
			tabela.addCell("Plano de pagamento");
			tabela.addCell(extrato.getFormaDePagamento().toString());
			tabela.addCell("Quantidade");
			if(extrato.getQtdeDiariasASeremPagas() != 0){
				tabela.addCell(String.valueOf(extrato.getQtdeDiariasASeremPagas()));
			}else{
				tabela.addCell(String.valueOf(extrato.getQuilometragem()));
			}			
			documento.add(tabela);
			documento.add(new Paragraph("\n"));
			//Criar outra tabela com os veiculos locados
			PdfPTable tabelaDeVeiculos = new PdfPTable(1);
			HashSet<String> veiculos = extrato.getCodigosDosVeiculos();
			Iterator<String> iterador = veiculos.iterator();
			
			PdfPCell tituloCarros = new PdfPCell(new Paragraph("Veiculos Locados", f));
			tabelaDeVeiculos.addCell(tituloCarros);
			
			while(iterador.hasNext()){
				tabelaDeVeiculos.addCell("CODIGO DO VEICULO LOCADO: "+iterador.next());
			}
			
			documento.add(tabelaDeVeiculos);
			
			//Detalhamento do valor
			Paragraph detalhamento = new Paragraph("Detalhamento\n", f);
			documento.add(detalhamento);
			documento.add(new Paragraph(extrato.getMovimentacaoParaImpressao()));
			
			//Valor final
			Paragraph valorFinal = new Paragraph(String.format("TOTAL ------------------------------------------------- R$ %.2f",extrato.getPrecoTotal()), f);
			documento.add(valorFinal);
			
			/*Deve ser colocado todos os atributos necessarios para informacao da classe Extrato*/
			
			
			//No final abre o arquivo para o usuario
			documento.close();
			fileOutputStream.close();
					
		}catch(DocumentException doex){
			System.out.println(doex.getMessage());
		
		}
		catch(IOException ioe){
			System.out.println(ioe.getMessage());
			
		}
		catch(Exception erro){
			System.out.println(erro.getMessage());
		}
		finally{
			if(documento != null){
				documento.close();
				fileOutputStream.close();
				
			}
		}
	
		File pdf = new File(this.nomeAtual);
		Desktop.getDesktop().open(pdf);
		
	}
	
	
}
